import type { FormMode } from './baseEnum'

export type CommonField = {
  prop: string // 列属性名
  label: string // 列标题

  formMeta?: FormFieldMeta // 表单配置项
  tableMeta?: TableFieldMeta // 表格配置项
}

export type SelectOptions = {
  label: string
  value: string | number | boolean
  children?: SelectOptions[]
}

export type FormFieldMeta = {
  hideInForm?: boolean // 是否隐藏在表单中，默认为false

  type?: string // 表单类型，默认为text
  placeholder?: string // 占位符
  isPwd?: boolean // 是否是密码类型
  rules?: any[] // 表单验证规则
  options?: SelectOptions[] // 单选框和多选框选项
  hideOn?: FormMode[] // 哪些模式下隐藏该项，默认为[]
  hideIf?: (formData: any) => boolean // 与表单其他项关联的隐藏条件函数
  disabledOn?: FormMode[] // 哪些模式下禁用该项，默认为[]
}

// todo 可以考虑加入显示顺序，分离和form的显示顺序
export type TableFieldMeta = {
  hideInTable?: boolean // 是否隐藏在表格中，默认为false

  align?: string // 列对齐方式，默认为left
  width?: string // 列宽度，默认为auto
  type?: string // 列类型，标注是否为index

  contentType?: string // 列内容类型text/tag/image/...，默认为text
  tagMapper?: { [key: number | string]: { text: string; type: string } } // 标签映射，用于将标签值映射为标签文本，默认为{}

  showOverflowTooltip?: boolean // 是否显示溢出提示，默认为false
  formatter?: (row: any, column: any, cellValue: any, index: number) => any // 列格式化函数
}

export type DescField = {
  itemWidth?: string | number // item宽度
  label: string // 描述标题
  labelIcon?: string // 描述图标
  prop: string // 描述属性名

  contentType?: string // 描述内容类型text/tag/image/...，默认为text
  tagMapper?: { [key: number | string]: { text: string; type: string } } // 标签映射，用于将标签值映射为标签文本，默认为{}

  formatter?: (cellValue: any) => any // 列格式化函数
}
